Amazon Bedrock の Converse API を使ってみる
こんにちは、森田です。
Amazon Bedrock には、Converse API と呼ばれる便利なモデル呼び出し方法があります。
本記事では、Converse API の良さとその使い方について紹介します。
InvokeModel APIについて
従来、基盤モデルを利用するためには、InvokeModel APIを使用していました。
InvokeModel APIでは、以下のように各モデルごとでプロンプトの渡し方やパラメータの指定、出力結果が異なっていました。
import boto3
import json
prompt = "クラスメソッド株式会社について教えて"
body = json.dumps({
"inputText": f"User: {prompt}\nBot:",
"textGenerationConfig": {
"temperature": 0.1,
"topP": 0.9,
"maxTokenCount": 500,
"stopSequences": [],
}
})
bedrock_runtime = boto3.client(
service_name='bedrock-runtime',
region_name='us-east-1'
)
modelId = 'amazon.titan-text-premier-v1:0'
response = bedrock_runtime.invoke_model(
body=body,
modelId=modelId,
accept='application/json',
contentType='application/json'
)
body = response.get('body').read().decode('utf-8')
response_body = json.loads(body)
print(response_body['results'][0]['outputText'])
import boto3
import json
prompt = "クラスメソッド株式会社について教えて"
bedrock_runtime = boto3.client(
service_name='bedrock-runtime',
region_name='us-east-1'
)
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"messages": [
{
"role": "user",
"content": [{"type": "text", "text": prompt}]
}
]
})
modelId = 'anthropic.claude-3-sonnet-20240229-v1:0'
response = bedrock_runtime.invoke_model(body=body, modelId=modelId)
response_body = json.loads(response.get('body').read())
print(response_body["content"][0]["text"])
InvokeModel APIを使っているアプリケーションでモデルの変更を行いたい場合は、各モデルごとのプロンプトやパラメータ、出力についての仕様を理解しながら、コードの変更を行う必要があります。
Converse API とは
Converse APIでは、Bedrockの基盤モデル対して共通したアクセスができるようになります。
InvokeModel APIのように、モデルごとの差異を意識することなく、モデルの切り替えが容易になります。
また、InvokeModel APIと同じようにStreamでの呼び出しも可能です。
このAPIを利用するためには、以下の権限が必要となります
- bedrock:InvokeModel
- bedrock:InvokeModelWithResponseStream。
ただし、現時点(2024/07/05)では、すべての基盤モデルで利用できるAPIではありませんので、ご注意ください。
Model | Converse | ConverseStream |
---|---|---|
AI21 Jamba-Instruct | Yes | No |
AI21 Labs Jurassic-2 (Text) | Limited. No chat support. | No |
Amazon Titan models | Yes | Yes |
Anthropic Claude 2 and earlier | Yes | Yes |
Anthropic Claude 3 | Yes | Yes |
Anthropic Claude 3.5 | Yes | Yes |
Cohere Command | Limited. No chat support. | Limited. No chat support. |
Cohere Command Light | Limited. No chat support. | Limited. No chat support. |
Cohere Command R and Command R+ | Yes | Yes |
Meta Llama 2 and Llama 3 | Yes | Yes |
Mistral AI Instruct | Yes | Yes |
Mistral Large | Yes | Yes |
Mistral Small | Yes | Yes |
コード例
では、実際に、Amazon Titan Text を Converse API で呼び出してみます。
import boto3
client = boto3.client("bedrock-runtime", region_name="us-east-1")
modelId = 'amazon.titan-text-premier-v1:0'
prompt = "クラスメソッド株式会社について教えて"
messages = [
{
"role": "user",
"content": [{"text": prompt}],
}
]
inferenceConfig = {
"temperature": 0.1,
"topP": 0.9,
"maxTokens": 500,
"stopSequences":[]
}
response = client.converse(
modelId=modelId ,
messages=messages,
inferenceConfig=inferenceConfig
)
print(response["output"]["message"]["content"][0]["text"])
入力パラメータ
modelId
modelIdには、Amazon Bedrock のモデルIDを指定します。
messages
messagesには、以下のような Message オブジェクトをリスト型で渡します。
{
"role": "user | assistant",
"content": [
{
"text": "string"
}
]
}
inferenceConfig
以下4つの基本的な推論パラメータの指定を行います。
- temperature
- topP
- maxTokens
- stopSequences
また、上記以外の各モデルの固有のパラメータは、 additionalModelRequestFields として指定が可能です。
レスポンス
レスポンスについては以下のようなフォーマットとなります。
{
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "---生成されたテキスト---"
}
]
}
},
"stopReason": "end_turn",
"usage": {
"inputTokens": 125,
"outputTokens": 60,
"totalTokens": 185
},
"metrics": {
"latencyMs": 1175
}
}
テキスト情報を取得したい場合は、以下のようなコードとなります。
print(response["output"]["message"]["content"][0]["text"])
まとめ
Converse APIは、基盤モデルへの共通アクセスを提供し、モデル切り替えを容易にする画期的な機能です。
従来の InvokeModel API と異なり、モデル間の差異を意識せず利用可能で、ストリーミングにも対応しています。
ただし、現時点では一部モデルのみ対応しているため、利用される際にはご注意ください。
この API の登場により、開発者は異なるモデル間でのコード変更を最小限に抑えられ、より柔軟なアプリケーション開発が可能になると期待できるので、ぜひチェックしてみてください。